public class Singleton {
    // 使用volatile关键字修饰，保证多线程环境下变量的可见性以及防止指令重排序
    private static volatile Singleton instance = null;

    // 私有构造函数，防止外部实例化
    private Singleton() {
        System.out.println("Singleton instance created.");
    }

    // 提供一个公共的静态方法，用于返回唯一的实例
    public static Singleton getInstance() {
        if (instance == null) {
            // 第一次检查，减少不必要的同步开销，若实例已存在则直接返回
            synchronized (Singleton.class) {
                if (instance == null) {
                    // 第二次检查，确保在多线程竞争情况下只有一个实例被创建
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // 示例方法，用于展示单例对象的功能
    public void showMessage() {
        System.out.println("Hello from the Singleton!");
    }

    // 测试单例模式
    public static void main(String[] args) {
        // 获取单例对象并调用其方法
        Singleton singleton1 = Singleton.getInstance();
        singleton1.showMessage();

        // 尝试获取另一个单例对象并调用其方法
        Singleton singleton2 = Singleton.getInstance();
        singleton2.showMessage();

        // 比较两个对象是否相同
        if (singleton1 == singleton2) {
            System.out.println("singleton1 and singleton2 are the same instance.");
        } else {
            System.out.println("singleton1 and singleton2 are different instances.");
        }
    }
}